#include "musicwindow.h"
#include "ui_musicwindow.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QMediaContent>

musicWindow::musicWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::musicWindow)
{
    ui->setupUi(this);

    this->setWindowFlag(Qt::FramelessWindowHint);//设置窗口为无边框
    this->setAttribute(Qt::WA_TranslucentBackground);//把窗口设置为透明

    m_pModel = new QStandardItemModel(ui->tableView);//实例化模型，并且指定模型依赖的控件
    //将数据模型设置到表对象上
    ui->tableView->setModel(m_pModel);

    //循环添加三行数据
    for(int index = 0; index != 3; ++index)
    {
    //添加一行数据
    //StandardItem是一个可以存放数据的容器，相当于一个变量，多个StandardItem可以存放在一个QList中
    //这个QList就是整个QStandardItemModel中的一行数据
        m_pModel->appendRow(QList<QStandardItem *>()<< new QStandardItem(QString("第%1行，第0列").arg(index))<< new QStandardItem(QString("第%1行，第1列第%1行，第1列第%1行，第1列").arg(index)));
    }

    QStringList fonts;
    fonts << "歌名" << "歌手" << "专辑" << "时长";
    m_pModel->setHorizontalHeaderLabels(fonts);

    ui->tableView->setColumnWidth(1,200);

    http = new QNetworkAccessManager(this);//实例化网络访问对象
    connect(http,SIGNAL(finished(QNetworkReply *)),this,SLOT(get_http_mes_slot(QNetworkReply *)));

    player = new QMediaPlayer;
    playlist = new QMediaPlaylist;
    player->setPlaylist(playlist);
    //durationChanged是开始播放的时候会产生的总时长信号
    connect(player,&QMediaPlayer::durationChanged,this,&musicWindow::durationChanged_slot);
    //播放音乐的进度发生改变的时候会产生的信号，进度是以时间为单位
    connect(player,&QMediaPlayer::positionChanged,this,&musicWindow::positionChanged_slot);
}

musicWindow::~musicWindow()
{
    delete ui;
}

void musicWindow::setComebackWindow(QWidget *pWindow)
{
    pComebackWindow = pWindow;
}

void musicWindow::on_pushButton_clicked()
{
    this->close();
    pComebackWindow->show();
}

void musicWindow::get_http_mes_slot(QNetworkReply *reply)
{
    int state = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    if(state != 200)
    {
        qDebug()<<"网络连接错误";
        return;
    }
    qDebug()<<"网络访问成功";
    QByteArray data = reply->readAll();//读取网页返回的数据
//    QString str(data);
//    qDebug()<<str;
    parseJson(data);
}

void musicWindow::on_pushButton_3_clicked()
{
    QString seach = ui->lineEdit->text();//获得文本框上的内容
    //构建网易云音乐请求连接
    QString address = "http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s=" ;
    address+=seach;
    address += "&type=1&offset=0&total=true&limit=10";
    qDebug()<<address;
    //发送请求
    http->get(QNetworkRequest(QUrl(address)));//搜素歌曲信息
}

void musicWindow::parseJson(QByteArray json)
{
    //把模型,数组和播放列表里面的内容都清理掉，准备接受新的歌曲信息
    m_pModel->clear();
    musicInfo.clear();
    playlist->clear();
    int index=0;
    QString songname_original2; //歌曲名
    QString singername2;        //歌手
    QString album_name2;        //专辑
    int duration2;          	//时间
    int music_id;               //id
    QByteArray byte_array = json;
    QJsonParseError json_error;//JSON解析错误对象
    //首先把JSON字符串转为JSON文档，这样才能去检测里面是否包含JSON对象和数组等等。。。
    //在转换的过程中如果出错，会把错误原因放在json_error里面
    QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error);

    if (json_error.error == QJsonParseError::NoError)//判断解析过程是否有错误
    {
        if (parse_doucment.isObject())//判断文档是否是一个json对象
        {
            QJsonObject rootObj = parse_doucment.object();//获取文档JSON对象
            if (rootObj.contains("result"))//对象中是否包含键result
            {
                QJsonValue valuedata = rootObj.value("result");
                if (valuedata.isObject())//result对应的值是否是一个对象
                {
                    QJsonObject valuedataObject = valuedata.toObject();//把QJsonValue转为JsonObject对象
                    if (valuedataObject.contains("songs"))
                    {
                        QJsonValue valueArray = valuedataObject.value("songs");
                        if (valueArray.isArray())
                        {
                            //把结果转为QJsonArray数组才能遍历
                            QJsonArray array = valueArray.toArray();
                            int size = array.size();//(size>36?36:size)
                            for (int i = 0; i <=size; i++)
                            {
                                QJsonValue value = array.at(i);
                                if (value.isObject())
                                {
                                    QJsonObject object = value.toObject();
                                    if (object.contains("album"))//专辑1
                                    {
                                        QJsonValue album_Object_1 = object.value("album");
                                        if (album_Object_1.isObject())
                                        {
                                            QJsonObject album_Object_1_tmp=album_Object_1.toObject();
                                            if(album_Object_1_tmp.contains("name"))
                                            {
                                                QJsonValue ID_value = album_Object_1_tmp.value("name");
                                                if (ID_value.isString())
                                                {
                                                    album_name2 = ID_value.toString();
                                                }
                                            }
                                        }
                                    }
                                    if (object.contains("alias"))//专辑2
                                    {
                                        QJsonValue Album_value_tmp = object.value("alias");
                                        if (Album_value_tmp.isArray())
                                        {
                                            QJsonArray Album_value_array=Album_value_tmp.toArray();
                                            if(Album_value_tmp.isArray())
                                            {
                                                if(Album_value_array.at(0).toString()!="")
                                                album_name2 = Album_value_array.at(0).toString()+"(别名)";
                                            }
                                        }
                                    }
                                    if (object.contains("artists"))//歌手
                                    {
                                        QJsonValue artists_value_tmp = object.take("artists");
                                        if(artists_value_tmp.isArray())
                                        {
                                            QJsonArray artists_array = artists_value_tmp.toArray();
                                            int artists_size=artists_array.size();
                                            for(int k=0;k<artists_size;k++)
                                            {
                                                QJsonValue artists_name=artists_array.at(k);
                                                if(artists_name.isObject())
                                                {
                                                    QJsonObject artists_name_object=artists_name.toObject();
                                                    if(artists_name_object.contains("name"))
                                                    {
                                                        QJsonValue artistsname = artists_name_object.take("name");
                                                        if (artistsname.isString())
                                                        {
                                                            if(k==0)
                                                            {
                                                                //qDebug()<<"artistsname="<<artistsname.toString();
                                                                singername2 = artistsname.toString();
                                                            }
                                                            else
                                                            {
                                                                singername2 = singername2 + "/" +artistsname.toString();
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    if (object.contains("name"))//歌曲名
                                    {
                                        QJsonValue Album_ID_value = object.take("name");
                                        if (Album_ID_value.isString())
                                        {
                                            songname_original2 = Album_ID_value.toString();
                                        }
                                    }
                                    if (object.contains("duration"))//时长
                                    {
                                       QJsonValue AlbumID_value = object.take("duration").toInt();
                                       duration2 = AlbumID_value.toInt();
                                       duration2=duration2/1000;
                                    }
                                    if (object.contains("id"))//歌曲id
                                    {
                                        QJsonValue FileHash_value = object.take("id");
                                        if (!FileHash_value.isNull())
                                        {
                                            //用Vector保存每首歌曲的album_id
//                                            m_ID.append(FileHash_value.toInt());
                                            music_id = FileHash_value.toInt();
                                        }
                                    }
                                    //把歌曲数据保存到数组中
                                    musicInfo.append(new musicNode(music_id,songname_original2,singername2,album_name2,duration2));
                                    //把歌曲数据显示到表格中
                                    m_pModel->appendRow(QList<QStandardItem *>()<< new QStandardItem(songname_original2)<< new QStandardItem(singername2)<< new QStandardItem(album_name2) << new QStandardItem(QString("%1").arg(duration2)) );
                                    //构建一个播放的链接
                                    QString playUrl = "http://music.163.com/song/media/outer/url?id=";
                                    playUrl+=QString::number(music_id);
                                    playUrl+=".mp3";
                                    qDebug()<<playUrl;
//                                    把链接添加到播放列表
                                    playlist->addMedia(QUrl(playUrl));
//                                    qDebug()<< music_id <<songname_original2<<singername2<<album_name2<<duration2;                                    index++;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    else
    {
        qDebug() << json_error.errorString();
    }
}

void musicWindow::on_tableView_doubleClicked(const QModelIndex &index)
{
//    "http://music.163.com/song/media/outer/url?id=406737384";
    qDebug()<<index.row();
    playlist->setCurrentIndex(index.row());
    player->setVolume(100);
    player->play();
}

//播放器开始播放的时候会把时间设置为当前歌曲的总时长，所以是一个时间改变的信号
void musicWindow::durationChanged_slot(int duration)
{
//    duration是总时长
    ui->horizontalSlider->setValue(0);
    ui->horizontalSlider->setRange(0, duration);//把滑块的范围改为了0-总时长（毫秒）
}

void musicWindow::positionChanged_slot(int current_postion)
{//current_postion歌曲当前播放的进度（毫秒时间）
    ui->horizontalSlider->setValue(current_postion);
}

void musicWindow::on_horizontalSlider_sliderPressed()
{
}

void musicWindow::on_horizontalSlider_sliderReleased()
{
    //把播放的进度设置到滑块的当前值（位置）
    player->setPosition(ui->horizontalSlider->value());
}
